import pymysql


class DBTools(object):
    # 创建一个普通数据库工具类
    @staticmethod  # 静态方法,只在类定义内使用
    def __create_conn():  # 私有方法
        # 创建数据库连接
        conn = pymysql.connect(host="211.103.136.244", port=7061, user="student",
                               password="iHRM_student_2022", database="ihrm",
                               charset="utf8")
        return conn  # 将数据库连接对象 返回给调用者

    @staticmethod
    def query_one(sql):  # 查询一条数据
        conn = None
        cursor = None
        res = None
        try:  # 尝试执行的代码
            conn = DBTools.__create_conn()  # 使用类名调用静态方法,创建连接
            cursor = conn.cursor()  # 创建游标
            cursor.execute(sql)  # 执行用户传入的 查询sql语句
            res = cursor.fetchone()  # 提取一条数据

        except Exception as e:  # 出现异常时执行的代码
            print("查询时,出现异常:", e)

        finally:  # 无论异常是否出现都会执行的代码
            cursor.close()  # 关闭游标
            conn.close()  # 关闭连接
            return res  # 返回查询结果,给调用者

    @staticmethod
    def query_all(sql):  # 查询所有数据
        conn = None
        cursor = None
        res = None
        try:  # 尝试执行的代码
            # 创建链接
            conn = DBTools.__create_conn()  # 使用类名调用静态方法,创建连接
            cursor = conn.cursor()  # 创建游标
            cursor.execute(sql)  # 执行用户传入的 查询sql语句
            cursor.rownumber = 0  # 设置游标归零
            res = cursor.fetchall()  # 提取数据(需游标归0)
        except Exception as e:  # 出现异常时执行的代码
            print("查询时,出现异常:", e)
        finally:  # 无论异常是否出现都会执行的代码
            cursor.close()  # 关闭游标
            conn.close()  # 关闭连接
            return res  # 返回查询结果,给调用者

    @staticmethod
    def query_many(num, size, sql):  # 查询指定条数
        conn = None
        cursor = None
        res = None
        try:  # 尝试执行的代码
            # 创建链接
            conn = DBTools.__create_conn()  # 使用类名调用静态方法,创建连接
            cursor = conn.cursor()  # 创建游标
            cursor.execute(sql)  # 执行用户传入的 查询sql语句
            cursor.rownumber = num  # 设置游标
            res = cursor.fetchmany(size)  # 查询第size条数据--共提取几条
        except Exception as e:  # 出现异常时执行的代码
            print("查询时,出现异常:", e)
        finally:  # 无论异常是否出现都会执行的代码
            cursor.close()  # 关闭游标
            conn.close()  # 关闭连接
            return res  # 返回查询结果,给调用者

    @staticmethod
    def db_iud(sql):  # 增,删,改
        conn = None
        cursor = None
        try:  # 尝试执行的代码
            conn = DBTools.__create_conn()  # 使用类名调用静态方法,创建连接
            cursor = conn.cursor()  # 创建游标
            cursor.execute(sql)  # 执行用户传入的 增删改查sql语句
            conn.commit()  # 提交数据
            print("增删改sql执行成功")

        except Exception as e:  # 出现异常时执行的代码
            print("增删改时,出现异常:", e)
            conn.rollback()  # 回滚
            print("回滚完成")

        finally:  # 无论异常是否出现都会执行的代码
            cursor.close()  # 关闭游标
            conn.close()  # 关闭连接


if __name__ == '__main__':
    res = DBTools.query_one("select * from t_book where id=723")
    print("查询结果为:", res)
    res = DBTools.query_all("select * from t_book")
    print("查询结果为:", res)
    res = DBTools.query_many(3, 5, "select * from t_book")
    print("查询结果为:", res)
    # DBTools.db_iud("update t_book set `read`=100 where id=198;")
    res=DBTools.db_iud("insert into bs_user (username) value('张无忌');")
    print(res)

